package com.ideaaedi.commonds.tree;


import java.util.List;

/**
 * 单父节点树 - 以K为纽带， 树化T
 * <p>
 * 多父节点树，见{@link Treeify}
 * </p>
 *
 * <pre>{@link Treeify}实现实例:
 * {@code
 * @Data
 * @Builder
 * @NoArgsConstructor
 * @AllArgsConstructor
 * private static class Node implements Treeify<String, Node> {
 *     // 父节点key
 *     private String parentKey;
 *
 *     // 当前节点key
 *     private String key;
 *
 *     // 子节点
 *     private List<Node> children;
 *
 *     @Override
 *     public Node obtainNewInstance() {
 *         return this;
 *     }
 *
 *     @Override
 *     public String obtainNodeKey() {
 *         return this.key;
 *     }
 *
 *     @Override
 *     public String obtainParentNodeKey() {
 *         return this.parentKey;
 *     }
 *
 *     @Override
 *     public List<Node> obtainChildren() {
 *         return this.children;
 *     }
 *
 *     @Override
 *     public void initChildren() {
 *         if (children == null) {
 *             children = new ArrayList<>(16);
 *         }
 *     }
 *
 *     @Override
 *     public void disconnectChildren() {
 *         if (children != null) {
 *             children.clear();
 *         }
 *     }
 * }
 * }
 * </pre>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 1.0.0
 */
@SuppressWarnings({"unused", "SpellCheckingInspection"})
public interface Treeify<K, T extends Treeify<K, T>> {
    
    /**
     * (以this实例为基础，)获取新的t实例
     * <P>
     *  p.s. 当树中的节点和原对象节点使用同一个引用时，不当的编码可能导致一些意料外的bug； 所以这里提供这种方法，[如果需要的话]可以根据原对象获取一个新的对象
     *
     * @return  t实例
     */
    T obtainNewInstance();
    
    /**
     * 获取当前节点的key
     *
     * @return 当前节点的key
     */
    K obtainNodeKey();
    
    /**
     * 获取父节点的key
     *
     * @return  父节点的key
     */
    K obtainParentNodeKey();
    
    /**
     * 获取子节点集合
     *
     * @return 子节点集合
     */
    List<T> obtainChildren();
    
    /**
     * 初始化子节点信息
     */
    void initChildren();
    
    /**
     * 断开父子节点之间的children集合联系
     */
    void disconnectChildren();
}
